一些效果实现
# 一些效果实现
[TOC]
# 一、图形绘制
# 1.1 三角形
参考教程: CSS绘制三角形的原理剖析 (opens new window)
/* 倒三角形(正方形的四分之一)*/
.triangle1 {
width: 0;
height: 0;
border: 20px solid;
border-color: #ccc transparent transparent transparent
}
/* 正方形对角线下的直角三角形 */
.triangle2 {
height: 0;
width: 0;
border-bottom: 100px solid yellow;
border-right: 100px solid transparent;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1.2 梯形
.trapezoid {
height: 0;
width: 100px;
border-bottom: 100px solid yellow;
border-right: 100px solid transparent;
}
1
2
3
4
5
6
2
3
4
5
6
# 1.3 扇形
.sector {
width: 0;
height: 0;
/* 先实现一个圆形 */
border: 50px solid;
border-radius: 50px;
border-color: #ccc transparent transparent;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 1.4 同心圆
box-shadow
- 第四个参数(扩张半径)控制投影面积,其他两个偏移量和模糊半径都设置为0。
- 注意事项:1. 不会影响布局。2. 不会响应鼠标事件,这时可在末尾加上inset。
box-shadow: 0 0 0 3px yellowgreen, 0 0 0 6px yellow; /* h-shadow; v-shadow; blur; spread; color */
1
radial-gradient
background-image: radial-gradient(red, green, blue);
background-image: repeating-radial-gradient(red, yellow 10%, green 15%);
1
2
2
border
# 1.5 圆形与椭圆形兼备
.badge {
display: inline-block;
box-sizing: border-box;
background: $error-c;
border-radius: 999rem;
font-size: 12px;
line-height: 12px;
color: #fff;
padding: 1% 2.5%;
margin-left: 8px;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 二、无需JS的功能实现
# 2.1 单词首字母大写
/* 首字母大写 */
.capitalize {
text-transform: capitalize;
}
/* 全部大写/小写 */
text-transform: uppercase / lowercase
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.2 超出部分省略显示
.ellipsis{
overflow:hidden; //超出的文本隐藏
text-overflow:ellipsis; //溢出用省略号显示
white-space:nowrap; //溢出不换行
}
/* 多行截断 */
/* 局限性:只能在webkit内核中实现 */
.ellipsis(@num) {
display: -webkit-box;
-webkit-box-orient: vertical; // 设置方向为纵向
overflow: hidden;
-webkit-line-clamp: @num; // 显示几行文本
text-overflow: ellipsis;
word-break: break-all; // 允许任意字符间断行
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2.3 粘性布局
.sticky {
position: sticky;
top: 0;
}
1
2
3
4
2
3
4
- 祖先元素的overflow不可以出现为hidden。
# 三、常用的效果实现
# 3.1 清除浮动
- 浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或另一个浮动元素。
- 清除浮动主要是为了解决父元素高度坍塌的问题。
# 3.1.1 clear(最佳方法)
- clear属性不允许被清除浮动的元素的左边/右边挨着浮动元素,底层原理是在被清除浮动的元素上边或者下边添加足够的清除空间。
- 通过别的元素上清除浮动来实现撑开高度。
/* 在父元素上添加 */
.clearfix:after{
content:"";
display:block;
clear:both;
/* 确保这个小块不会显示在页面上 */
visibility:hidden;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3.1.2 触发BFC
.box-wrapper{
/* 局限:元素阴影或下拉菜单会被截断 */
overflow: hidden;
}
1
2
3
4
2
3
4
# 3.2 滚动条滚动到指定锚点
# 3.2.1 a标签跳转到对应id
<a href="#content1"></a>
<div id="content1">跳到这里</div>
1
2
2
# 3.2.2 Element.scrollIntoView()
// 将某个元素跳转到浏览器视口的最上方
element.scrollIntoView()
1
2
2
- 参数
- Boolean型参数:true-元素的顶端将和其所在滚动区的可视区域的顶端对齐 ; false-元素的底端将和其所在滚动区的可视区域的底端对齐。
- Object型参数:{ behavior: "auto"(默认) | "instant" | "smooth"(缓动), block: "start" | "end", }
# 3.2.3 css(推荐)
在需要滚动的div添加
scroll-behavior: smooth; // 滚动条缓慢滚动
1
# 3.3 暗黑效果
html {
filter: invert(1) hue-rotate(180deg);
}
html img { /* 只是为了反转 */
filter: invert(1) hue-rotate(180deg);
}
a { /* 只是为了反转 */
filter: invert(1) hue-rotate(180deg);
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3.4 图片与文本底部之间存在空白
- 首先
vertical-align
的默认是值是baseline
(西文排版的概念),则p、g、q下面的小尾巴就会出现在baseline
的下面,而图片的baseline就是图片的下边框。也就是说,图片下面的那部分空白的高度,就是baseline
与bottom
之间的距离。 - 解决方案:
- 将图片和文本的
vertical-align
都设为bottom
,则视觉上底部都在一条线上。 - flex布局
- 将图片和文本的
# 3.5 悬浮边框动画
button {
border: 0;
background: none;
cursor: pointer;
position: relative;
}
button:before,
button:after {
box-sizing: inherit;
position: absolute;
content: '';
border: 2px solid transparent;
width: 0;
height: 0;
}
button::after {
bottom: 0;
right: 0;
}
button::before {
top: 0;
left: 0;
}
button:hover::before,
button:hover::after {
width: 100%;
height: 100%;
}
button:hover::before {
border-top-color: #4361ee;
border-right-color: #4361ee;
transition: width 0.3s ease-out, height 0.3s ease-out 0.3s;
}
button:hover::after {
border-bottom-color: #4361ee;
border-left-color: #4361ee;
transition: border-color 0s ease-out 0.6s, width 0.3s ease-out 0.6s, height 0.3s ease-out 0.9s;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 3.6 移动端去掉点击热区
outline: none;
-webkit-tap-highlight-color: transparent;
1
2
2
# 3.7 文本两端对齐
.label {
// white-space: nowrap;
text-align: justify;
// 高度最好写死
height: 20px;
line-height: 20px;
&::after { // 可以填充(兼容浏览器)
width: 100%;
content: "";
display: inline-block;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3.8 换行
/* 强制不换行 */
div {white-space:nowrap;}
/* 自动换行 */
div {
word-wrap: break-word;
word-break: normal; /* 默认 */
}
/* 强制英文单词断行 */
div {
word-break: break-all;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3.9 使用默认系统字体
font-family: system-ui
1
# 四、交互优化
# 4.1 扩大点击区域
.btn::befoer{
content:"";
position:absolute;
top:-10px;
right:-10px;
bottom:-10px;
left:-10px;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4.2 平滑滚动
scroll-behavior: smooth; /* 在可滚动容器上添加 */
1
# 4.3 快速选择指定内容
将需要一次选中的内容进行包裹,用户只需要点击一次,就可以选中该段信息
user-select: all // none的话,即为禁止选择
1
# 五、样式优化
# 5.1 会变的渐变色
.gradient {
background-image: linear-gradient(92deg, #f66 0%, #f90 100%);
background-clip: text;
color: #f66;
animation: hue 60s infinite linear;
-webkit-text-fill-color: transparent;
}
@keyframes hue {
from {
filter: hue-rotate(0);
}
to {
filter: hue-rotate(-360deg);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16